/*
 * video-graphics.h
 *
 *  Created on: 6/Mar/2010
 *      Author: Ângela Igreja
 */

#ifndef _VIDEO_GRAPHICS_H_
#define _VIDEO_GRAPHICS_H_

#include <dpmi.h>
#include <go32.h>
#include <sys/nearptr.h>
#include <sys/farptr.h>
#include "utypes.h"


/** @defgroup Video Video
 * @{
 *
 * Entering/leaving/utility video functions
 */

/*
 * there are two global variables, declared (but not defined) here
 */
extern int HRES;  /**< global variable with the horizontal resolution in pixels */
extern int VRES;  /**< global variable with the vertical resolution in pixels */

ulong get_memory_video_address(int mode);


/**
 * Mapeia memoria para a placa grafica, entra em modo grafico
 * e inicializa as variaveis de resolucao do ecra
 * @return Apontador generico para o endereco de memoria de
 * 	video (NULL se erro)
 *
 * @param mode Modo grafico VESA a usar
 * @param map Informacao a mapear
 */
char * enter_graphics(int mode, __dpmi_meminfo *map);

/**
 * Desmapear a memoria de video, desactivar apontadores e
 * retornar ao modo texto
 * @param map Informacao a desmapear
 */
void leave_graphics(__dpmi_meminfo map);

/**
* Desenha um pixel com uma determinada cor no ecra, nas coordenadas (x,y).
* @param x posicao no eixo dos x
* @param y posicao no eixo dos y
* @param color cor
* @param base apontador para memoria de enderecos
*/
void set_pixel(int x, int y, int color, char *base);

/** devolve a cor do pixel que está na posicao (x,y)
* @return cor do pixel
*
* @param x posicao no eixo dos x
* @param y posicao no eixo dos y
* @param base apontador para memoria de enderecos
*/
int get_pixel(int x, int y, char *base);

/** pinta o ecra de uma determinada cor, dando o efeito de se ter "limpo" o ecra
* @param color cor
* @param base apontador para memoria de enderecos
*/
void clear_screen(char color, char *base);

/** desenha uma linha com uma cor entre as posicoes (xi,yi) e (xf,yf)
* @param xi posicao inicial no eixo dos x
* @param yi posicao inicial no eixo dos y
* @param xf posicao final no eixo dos x
* @param yf posicao final no eixo dos y
* @param color cor
* @param base apontador para memoria de enderecos
*/
void draw_line(int xi, int yi, int xf, int yf, int color, char *base);

/** Função que desenha uma circunferencia numa determinada posição
 *  @param x0 posição do centro no eixo dos x
 *  @param y0 posição do centro no eixo dos y
 *  @param radius raio
 *  @param color cor
 *  @param base apontador para memória gráfica
 */
void draw_circle(int x0, int y0, int radius , int color, char *base);

/** Funçao que desenha um caracter numa determinada posicao
 *  @param c caracter a ser desenhado
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória gráfica
 *  @param table apontador para tabela ASCII
 */
void drawCharAt(char c, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);

/** Funçao que desenha uma string numa determinada posiçao
 *  @param str string a ser desenhada
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória gráfica
 *  @param table apontador para tabela ASCII
 */
void drawStringAt(char* str, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);

/** Funçao que desenha um inteiro numa determinada posição
 *  @param num número a ser desenhado
 *  @param x posiçao no eixo dos x
 *  @param y posiçao no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param char_scale tamanho do caracter
 *  @param video_base apontador para memória gráfica
 *  @param table apontador para tabela ASCII
 */
void drawIntAt(int num, int x, int y, int fore_color, int back_color, int char_scale, char *video_base, char *table);

/** Funçao que desenha um título numa determinada posiçao
 *  @param title título a ser desenhado
 *  @param xi posição inicial no eixo dos x
 *  @param yi posição inicial no eixo dos y
 *  @param xf posição final no eixo dos x
 *  @param yf posição final no eixo dos y
 *  @param fore_color cor
 *  @param back_color cor de fundo do caracter
 *  @param base apontador para memória gráfica
 *  @param char_scale tamanho do caracter
 *  @param table apontador para tabela ASCII
 */
void drawTitle(char * title, int xi, int yi, int xf, int yf, int fore_color, int back_color, char * base, int char_scale, char * table);

/** Função que desenha um caixa numa determinada posição
 *  @param xi posição inicial no eixo dos x
 *  @param yi posição inicial no eixo dos y
 *  @param xf posição final no eixo dos x
 *  @param yf posição final no eixo dos y
 *  @param fore_color cor
 * @param  fill parametro para saber se o interior é pintado ou não
 *  @param base apontador para memória gráfica
 */
void drawBox( int xi, int yi, int xf, int yf, int fore_color, int fill , char * base );


/** Função que desenha o título carregado duma sprite
 *  @param x posição inicial no eixo dos x
 *  @param y posição inicial  no eixo dos y
 *  @param base apontador para memória gráfica
 */
void drawSpriteTitle( int x , int y , char * base );

/** @} end of video */

#endif /* VIDEOGRAPHICS_H_ */
